#ifndef REDIS_WRAPPER_H
#define REDIS_WRAPPER_H

#include <sw/redis++/redis++.h>
#include <string>
#include <vector>
#include <unordered_map>
#include <optional>
#include <memory>

class RedisWrapper {
public:
    // Constructor and destructor
    RedisWrapper(const std::string& uri);
    ~RedisWrapper() = default;

    // String operations
    bool set(const std::string& key, const std::string& value);
    std::optional<std::string> get(const std::string& key);
    bool del(const std::string& key);
    bool exists(const std::string& key);

    // List operations
    long long lpush(const std::string& key, const std::string& value);
    long long rpush(const std::string& key, const std::string& value);
    std::optional<std::string> lpop(const std::string& key);
    std::optional<std::string> rpop(const std::string& key);

    // Hash operations
    bool hset(const std::string& key, const std::string& field, const std::string& value);
    std::optional<std::string> hget(const std::string& key, const std::string& field);
    bool hdel(const std::string& key, const std::string& field);
    std::unordered_map<std::string, std::string> hgetall(const std::string& key);

    // Set operations
    bool sadd(const std::string& key, const std::string& member);
    bool sismember(const std::string& key, const std::string& member);
    long long scard(const std::string& key);
    std::vector<std::string> smembers(const std::string& key);

    // Sorted set operations
    bool zadd(const std::string& key, double score, const std::string& member);
    std::optional<double> zscore(const std::string& key, const std::string& member);
    long long zcard(const std::string& key);

    // Key operations
    long long expire(const std::string& key, long long seconds);
    long long ttl(const std::string& key);

private:
    std::shared_ptr<sw::redis::Redis> redis_;
};

#endif // REDIS_WRAPPER_H